package common.util;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 格式化java8  的 LocalDate  LocalDateTime
 *
 * @author yuanqinglong
 * @since 2020/12/28 10:24
 */
public class DateTimeFormatterUtil {


    /**
     * 格式化到年月
     */
    private static final DateTimeFormatter PRIVATE_FORMAT_TO_MONTH = DateTimeFormatter.ofPattern("yyyy-MM");
    /**
     * 格式化到年月日
     */
    private static final DateTimeFormatter PRIVATE_FORMAT_TO_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    /**
     * 格式化到年月日时分秒
     */
    private static final DateTimeFormatter PRIVATE_FORMAT_TO_DATE_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    private static final DateTimeFormatter SIMPLE_PRIVATE_FORMAT_TO_DATE_TIME = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

    /**
     * 将LocalDate格式化到年月（yyyy-MM）
     *
     * @param localDate 日期
     * @return 格式化后的年月
     */
    public static String localDateFormatterToMonth(LocalDate localDate) {
        return PRIVATE_FORMAT_TO_MONTH.format(localDate);
    }

    /**
     * 将LocalDate格式化String年月日（yyyy-MM-dd）
     *
     * @param localDate 日期
     * @return 格式化后的年月
     */
    public static String localDateFormatterToStringDate(LocalDate localDate) {
        return PRIVATE_FORMAT_TO_DATE.format(localDate);
    }


    /**
     * 将LocalDateTime格式化到年月日（yyyy-MM-dd）
     *
     * @param localDateTime 日期
     * @return 格式化后的日期
     */
    public static String dateTimeToDate(LocalDateTime localDateTime) {
        return PRIVATE_FORMAT_TO_DATE.format(localDateTime);
    }


    /**
     * 将LocalDateTime格式化到年月日时分秒（yyyy-MM-dd HH:mm:ss）
     *
     * @param localDateTime 日期
     * @return 格式化后的时间
     */
    public static String dateTimeToString(LocalDateTime localDateTime) {
        return PRIVATE_FORMAT_TO_DATE_TIME.format(localDateTime);
    }

    /**
     * 将LocalDateTime格式化到年月日时分秒（yyyy-MM-dd HH:mm:ss）
     *
     * @param localDateTime 日期
     * @return 格式化后的时间
     */
    public static String dateTimeToSimpleString(LocalDateTime localDateTime) {
        return SIMPLE_PRIVATE_FORMAT_TO_DATE_TIME.format(localDateTime);
    }

    /**
     * 将String类型日期转换成LocalDate
     *
     * @param date String类型日期
     * @return LocalDate
     */
    public static LocalDate stringDateToLocalDate(String date) {
        return LocalDate.parse(date, DateTimeFormatterUtil.PRIVATE_FORMAT_TO_DATE);
    }


    /**
     * 将String类型日期转换成LocalDate
     *
     * @param date String类型日期
     * @return LocalDate
     */
    public static LocalDateTime stringDateToLocalDateTime(String date) {
        return LocalDateTime.parse(date, DateTimeFormatterUtil.PRIVATE_FORMAT_TO_DATE_TIME);
    }

    /**
     * LocalDate转Date
     * @param localDate
     * @return
     */
    public static Date asDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }
    /**
     * LocalDateTime转Date
     * @param localDateTime
     * @return
     */
    public static Date asDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }
    /**
     * Date转LocalDate
     * @param date
     * @return
     */
    public static LocalDate asLocalDate(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
    }
    /**
     * Date转LocalDateTime
     * @param date
     * @return
     */
    public static LocalDateTime asLocalDateTime(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

}
